import axios, { AxiosRequestConfig } from "axios";
import { appConfig } from "../configs/env.config.load";
import * as https from "node:https";

interface AxiosRequestConfigExt extends AxiosRequestConfig {
  silent?: boolean;
}

export const genCancelToken = () => axios.CancelToken.source();

const v3Agent = new https.Agent({
  rejectUnauthorized: false,
});

export const v3proInstance = axios.create({
  httpsAgent: v3Agent,
});

v3proInstance.defaults.timeout = 30 * 1000;
v3proInstance.defaults.baseURL = appConfig.v3pro.server.baseUrl;

/**
 * 请求拦截器
 * header 追加 token，platform 等信息
 */
v3proInstance.interceptors.request.use((config: any) => {
  config.withCredentials = true;
  const sevCnf = appConfig.v3pro.server;
  const auth = Buffer.from(`${sevCnf.username}:${sevCnf.password}`).toString("base64");
  // config.headers["Professional"] = "sansi@v3pro";
  config.headers["Authorization"] = "Basic " + auth;
  return config;
});

/**
 * 响应拦截器
 * 处理统一 code 错误
 * 如果没有错误，提取 data 内容到下一级
 */
v3proInstance.interceptors.response.use((response: any) => {
  return Promise.resolve(response.data);
});

export const v3proRequest: (config: AxiosRequestConfigExt) => Promise<any> = v3proInstance;

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
// 以下是 starriver 请求

const srAgent = new https.Agent({
  rejectUnauthorized: false,
});

export const srInstance = axios.create({
  httpsAgent: srAgent,
});

srInstance.defaults.timeout = 30 * 1000;
srInstance.defaults.baseURL = appConfig.starriver.server.baseUrl;

/**
 * 请求拦截器
 * header 追加 token，platform 等信息
 */
srInstance.interceptors.request.use((config: any) => {
  // config.withCredentials = true;
  config.headers = {
    Accept: "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    ...(config.headers ?? {}),
  };
  return config;
});

/**
 * 响应拦截器
 * 处理统一 code 错误
 * 如果没有错误，提取 data 内容到下一级
 */
srInstance.interceptors.response.use((response: any) => {
  return Promise.resolve(response.data);
});

export const srRequest: (config: AxiosRequestConfigExt) => Promise<any> = srInstance;
